#ifndef _EXCEPTIONS_H_
#define	_EXCEPTIONS_H_

#include <Utils/String.h>

class Exception
{
public:
	Exception();
	Exception(const Utils::String &);
	virtual ~Exception();
	
	const Utils::String &GetMessage() const;
	
protected:
	Utils::String msg;
};

class ArgumentException : public Exception
{
public:
	ArgumentException();
	ArgumentException(const Utils::String &);
};

class ArgumentNullException : public ArgumentException
{
public:
	ArgumentNullException();
	ArgumentNullException(const Utils::String &);
	ArgumentNullException(const Utils::String &paramName, const Utils::String &funcName);
};

class ArgumentOutOfRangeException : public ArgumentException
{
public:
	ArgumentOutOfRangeException();
	ArgumentOutOfRangeException(const Utils::String &);
	ArgumentOutOfRangeException(const Utils::String &paramName, int64_t minValue, int64_t maxValue);
};

class NotImplementedException : public Exception
{
public:
	NotImplementedException();
	NotImplementedException(const Utils::String &m);
	NotImplementedException(const Utils::String &FunctionName, const Utils::String &ClassName);
};

class OutOfMemoryException : public Exception
{
public:
	OutOfMemoryException();
	OutOfMemoryException(const Utils::String &);
};

/* What the F*** just happened?? :) */
class WtfException : public Exception
{
public:
	WtfException();
	WtfException(const Utils::String &);
};

#endif
